package com.laowch.githubtrends.ui;
import android.content.Context;
import android.graphics.Color;
import android.support.v4.view.MotionEventCompat;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.laowch.githubtrends.Constants;
import com.laowch.githubtrends.R;
import com.laowch.githubtrends.helper.ItemTouchHelperAdapter;
import com.laowch.githubtrends.helper.ItemTouchHelperViewHolder;
import com.laowch.githubtrends.helper.OnStartDragListener;
import com.laowch.githubtrends.model.Language;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* Created by lao on 15/9/28.
*/
public class CustomLanguageAdapter extends RecyclerView.Adapter<CustomLanguageAdapter.ViewHolder> implements ItemTouchHelperAdapter {
Context context;
List<Language> mItems = new ArrayList<>();
private final OnStartDragListener mDragStartListener;
int mode;
public CustomLanguageAdapter(Context context, OnStartDragListener dragStartListener) {
this.mDragStartListener = dragStartListener;
this.context = context;
mode = Constants.MODE_DRAGGABLE;
}
public void switchMode(int mode) {
this.mode = mode;
notifyDataSetChanged();
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.custom_language_grid_item, parent, false);
return new ViewHolder(v);
}
@Override
public void onBindViewHolder(final ViewHolder viewHolder, int position) {
final Language language = mItems.get(position);
viewHolder.text.setText(language.name);
// Start a drag whenever the handle view it touched
viewHolder.handleView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_DOWN) {
mDragStartListener.onStartDrag(viewHolder);
}
return false;
}
});
viewHolder.removeView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int index = mItems.indexOf(language);
if (index >= 0) {
if (mItems.size() > 1) {
mItems.remove(index);
notifyItemRemoved(index);
} else {
ConfirmDialog confirmDialog = ConfirmDialog.newInstance("Invalid Operation", "You should keep at least one language.", 0, -1);
confirmDialog.show(((AppCompatActivity) context).getSupportFragmentManager(), "confirm");
}
}
}
});
switch (mode) {
case Constants.MODE_DRAGGABLE:
viewHolder.handleView.setVisibility(View.VISIBLE);
viewHolder.removeView.setVisibility(View.GONE);
break;
case Constants.MODE_REMOVE:
viewHolder.handleView.setVisibility(View.GONE);
viewHolder.removeView.setVisibility(View.VISIBLE);
break;
}
}
@Override
public int getItemCount() {
return mItems.size();
}
public void setItems(Language[] items) {
mItems.clear();
mItems.addAll(Arrays.asList(items));
notifyDataSetChanged();
}
@Override
public void onItemDismiss(int position) {
mItems.remove(position);
notifyItemRemoved(position);
}
@Override
public boolean onItemMove(int fromPosition, int toPosition) {
Language language = mItems.remove(fromPosition);
mItems.add(toPosition, language);
notifyItemMoved(fromPosition, toPosition);
return true;
}
public class ViewHolder extends RecyclerView.ViewHolder implements ItemTouchHelperViewHolder {
private TextView text;
private View handleView;
private View removeView;
public ViewHolder(View itemView) {
super(itemView);
text = (TextView) itemView.findViewById(R.id.text);
handleView = itemView.findViewById(R.id.handle);
removeView = itemView.findViewById(R.id.remove);
}
@Override
public void onItemSelected() {
itemView.setBackgroundColor(Color.LTGRAY);
}
@Override
public void onItemClear() {
itemView.setBackgroundColor(0);
}
}
}